package aop;

import java.util.Arrays;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

/**
 * 使用注解定义切面
 * @author DeBug
 *
 */
@Aspect
public class UserServiceLogger {
	private static final Logger log = Logger.getLogger(UserServiceLogger.class);
	/**
	 * 使用注解定义切面
	 */
	@Pointcut("execution(public void addNewUser(entity.User))")
	public void Pointcut(){};
	
	/**
	 * 前置增强
	 * @param jp
	 */
	@Before("Pointcut()")
	public void before(JoinPoint jp) {
	    log.info("调用 " + jp.getTarget() + " 的 " + jp.getSignature().getName()
	            + " 方法。方法入参：" + Arrays.toString(jp.getArgs()));
	    
	    
	}
	/**
	 * 后置增强
	 * @param jp
	 * @param result
	 */
	@AfterReturning(pointcut="Pointcut()",returning="result")
	public void afterReturning(JoinPoint jp, Object result) {
	    log.info("调用 " + jp.getTarget() + " 的 " + jp.getSignature().getName()
	            + " 方法。方法返回值：" + result);
	    
	   
	}

	/**
	 * 最终增强
	 * @param jp
	 */
	@After("Pointcut()")
	public void afterLogger(JoinPoint jp){
		log.info(jp.getSignature().getName()+"方法结束执行");
		
		 
	}
	/**
	 * 环绕增强
	 * @param jp
	 * @throws Throwable
	 */
	@Around("Pointcut()")
	public void aroundLogger(ProceedingJoinPoint jp)throws Throwable{
		
		log.info("调用 " + jp.getTarget() + " 的 " + jp.getSignature().getName()
	            + " 方法。方法入参：" + Arrays.toString(jp.getArgs()));
		try {
			Object result = jp.proceed();
			 log.info("调用 " + jp.getTarget() + " 的 " + jp.getSignature().getName()
			            + " 方法。方法返回值：" + result);
		} catch (Exception e) {
			log.error(jp.getSignature().getName()+"方法发生异常:"+e);
			throw e;
		}finally {
			
			log.info(jp.getSignature().getName()+"方法执行结束。");
		}
	}
}